package net.xju.common.utils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.TimeZone;

/**
 * 时区处理工具类，统一处理北京时间（Asia/Shanghai）相关的时间转换
 */
public class TimeZoneUtil {

    // 北京时间时区（东八区）
    public static final ZoneId BEIJING_ZONE_ID = ZoneId.of("Asia/Shanghai");
    public static final TimeZone BEIJING_TIME_ZONE = TimeZone.getTimeZone(BEIJING_ZONE_ID);

    // 默认时间格式（可根据需求扩展）
    public static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 设置JVM默认时区为北京时间（建议在项目启动时调用一次）
     */
    public static void setDefaultTimeZoneToBeijing() {
        TimeZone.setDefault(BEIJING_TIME_ZONE);
    }

    /**
     * 将LocalDateTime（无时区）转换为北京时间的ZonedDateTime（有时区）
     */
    public static ZonedDateTime toBeijingZonedDateTime(LocalDateTime localDateTime) {
        if (localDateTime == null) {
            return null;
        }
        return ZonedDateTime.of(localDateTime, BEIJING_ZONE_ID);
    }

    /**
     * 将UTC时间（Instant）转换为北京时间的LocalDateTime
     */
    public static LocalDateTime utcInstantToBeijingLocalDateTime(Instant utcInstant) {
        if (utcInstant == null) {
            return null;
        }
        return LocalDateTime.ofInstant(utcInstant, BEIJING_ZONE_ID);
    }

    /**
     * 将北京时间的LocalDateTime转换为UTC时间（Instant）
     */
    public static Instant beijingLocalDateTimeToUtcInstant(LocalDateTime beijingLdt) {
        if (beijingLdt == null) {
            return null;
        }
        return ZonedDateTime.of(beijingLdt, BEIJING_ZONE_ID).toInstant();
    }

    /**
     * 格式化北京时间的LocalDateTime为字符串
     */
    public static String formatBeijingLocalDateTime(LocalDateTime beijingLdt) {
        if (beijingLdt == null) {
            return null;
        }
        return beijingLdt.format(DEFAULT_FORMATTER);
    }

    /**
     * 将Date（包含时区偏移）转换为北京时间的LocalDateTime
     */
    public static LocalDateTime dateToBeijingLocalDateTime(Date date) {
        if (date == null) {
            return null;
        }
        return LocalDateTime.ofInstant(date.toInstant(), BEIJING_ZONE_ID);
    }

    /**
     * 将北京时间的LocalDateTime转换为Date
     */
    public static Date beijingLocalDateTimeToDate(LocalDateTime beijingLdt) {
        if (beijingLdt == null) {
            return null;
        }
        Instant instant = beijingLocalDateTimeToUtcInstant(beijingLdt);
        return Date.from(instant);
    }
}
